package fisica;

import java.util.ArrayList;

import objetos.CanvasGame;

public class SimuladorFisico {
	
	private static SimuladorFisico simulador;
	private ArrayList<ObjetoFisico> objetos;
	public float valorGravidade = 900;
	
	//private 
	
	private SimuladorFisico(){
		objetos = new ArrayList<ObjetoFisico>();
	}
	
	public static SimuladorFisico getSimulador(){
		if(simulador == null){
			simulador = new SimuladorFisico();
		}
		return simulador;
	}
	
	public void atualiza(float dt){
		aplicaGravidade(dt);
		testaColisaoObj();
		checaLimitesMapa();
		//aplicaAtrito();
	}
	
	public void addObject(ObjetoFisico obf){
		objetos.add(obf);
		System.out.println("objte nome"+ obf.nome);
	}
	
	private void testaColisaoObj(){
		ArrayList<ObjetoFisico> objetosColididindo ;
		ArrayList<ObjetoFisico> objetosColididindoHeroi ;
		objetosColididindo = new ArrayList<ObjetoFisico>();
		objetosColididindoHeroi = new ArrayList<ObjetoFisico>();
		objetosColididindo= new ArrayList<ObjetoFisico>();
		ObjetoFisico heroi = null;
//		+++++++++++++++++++==================== Achando coldem com heroi
		for(ObjetoFisico i: objetos){
			if(i.nome == "heroi"){
				heroi = i;
				for(ObjetoFisico j: objetos){
					if(heroi.estaColidindoObjeto(j) && heroi!= j){
						objetosColididindoHeroi.add(j);
						System.out.println("Colidindo com heroi "+j.nome);
					}
				}
			}
		}
		//+++===================================Colidem com quem colide com heroi
		for(ObjetoFisico k: objetosColididindoHeroi){
			for(ObjetoFisico g: objetos){
				if(k.estaColidindoObjeto(g) && k!= g && !objetosColididindoHeroi.contains(g)){
					objetosColididindo.add(g);
				}
			}
		}
		//=======================================Soma as massa e coloca no heroi
		int massaTotal = 0;
		for(ObjetoFisico b: objetosColididindoHeroi){
			massaTotal += b.massa;
		}
		for(ObjetoFisico b: objetosColididindo){
			massaTotal += b.massa;
		}
		if(heroi != null){
			massaTotal+= heroi.massa;
			heroi.massaTemporaria = massaTotal;
//			System.out.println("Massa : "+massaTotal);
		}else{
//			System.out.println("heroi nulo");
		}
		
		
		
//		for(ObjetoFisico i: objetos){
//			objetosColididindo = new ArrayList<>();
//			objetosColididindoHeroi = new ArrayList<>();
//			for(ObjetoFisico j: objetos){
//				if(i.estaColidindoObjeto(j) && i!= j){
//					objetosColididindo.add(j);
//				}
//			}
//			i.massaTemporaria = 0;
//			for(ObjetoFisico c: objetosColididindo){
//				i.massaTemporaria+= c.massa;
//			}
//			i.massaTemporaria+= i.massa;
//			System.out.println("Colidindo com  : "+objetosColididindo.size());
//			System.out.println("Objeto com massa temp de : "+i.massaTemporaria);
//		}
		
	}
//	private void teste(ObjetoFisico i) {
//		for(ObjetoFisico j: objetos){
//			if(j.estaColidindoObjeto(i)){
//				objetosColididindo.add(j);
//				teste(j);
//			}
//		}
//	}
	
	private void aplicaGravidade(float dt){ // aplica gravidade a todos os objetos adcionados
		
		for(ObjetoFisico i: objetos){
			if(!i.estaColidindoChao){ 
				i.tempoNoAr += dt;
				if(i.nome != "heroi" && i.nome != "inimigo"){
					//System.out.println("SimuladorFisico::aplicaGravidade =  dt : "+dt);
					//System.out.println("SimuladorFisico::aplicaGravidade =  tempoNoAr : "+i.tempoNoAr);
					//i.valorQuedaLivre -= (this.valorGravidade*i.tempoNoAr/1000)*dt/1000;
					i.Y += (this.valorGravidade*i.tempoNoAr/1000)*dt/1000;
				}
			}else{
				i.tempoNoAr = 1;
				i.velocidadeY = 0;
				i.valorQuedaLivre = 0;
				
			}
		}
	}
	
	private void checaLimitesMapa(){
		for(ObjetoFisico i: objetos){
			if(i.X < 30){
				i.X = 30;
			}
			
			if(i.Y < 10){
				i.Y = 10;
			}
			
			if(i.Y > 630){
				i.Y = 630;
			}
		}
	}
	
	
	public void limpaObjetos(){
		ObjetoFisico heroi = null;
		for(int i = 0; i < objetos.size(); i++){
			if(objetos.get(i).nome != "heroi"){
				try {
					System.out.println("LimpaLista "+objetos.get(i).nome);
					objetos.remove(objetos.get(i));
				} catch (Exception e) {
					System.out.println("errrooo");
				}
			}else{
				heroi = objetos.get(i);
				System.out.println(heroi.nome);
			}
		}
		objetos.clear();
		if(heroi != null){
			objetos.add(heroi);
		}
		System.out.println("tamanhoLista : "+objetos.size());
	}
	private void aplicaAtrito(){ // aplica gravidade a todos os objetos adcionados
		
		for(int i=0; i< objetos.size();i++){
//		
//			//objetos.get(i).velocidade = objetos.get(i).velocidadeInicial + objetos.get(i).aceleracao * objetos.get(i).tempo; 
//		
//			objetos.get(i).forcaAtrito = objetos.get(i).peso * objetos.get(i).coefAtrito;
//			
//			objetos.get(i).velocidade -= objetos.get(i).forcaAtrito; 
		
		}
		
	}
}
